/** Pakiet zawierający klasy związane z rozwiązywaniem FLP */
package flp.solvers;

import flp.Layout;
import flp.Layout.CostFunction;
import flp.exceptions.*;
import flp.problem.ProblemInstance;

/**
 * Baza dla klas rozwiazujacych problem FLP.
 * 
 * @author Necro i qadro_
 */
public abstract class Solver
{
    /**Problem do rozwiazania.*/
    protected ProblemInstance toSolve;
    protected IOptimizationMonitor optMonitor;
    protected boolean stoppedFlag;
    /**Uzywana funkcja liczaca koszt.*/
    static protected Layout.CostFunction preferableCostFunction;

    public Solver(ProblemInstance toSolve, IOptimizationMonitor optMonitor)
    {
        this.toSolve = toSolve;
        this.optMonitor = optMonitor;
        stoppedFlag = false;
    }
       
    ProblemInstance getCurrentProblem() {
        return toSolve;
    }

    /**
     * Metoda przeprowadzająca obliczenia.
     * 
     * @return Najlepsze znalezione rozwiazanie.
     */
    abstract public Layout computeSolution() throws LayoutBuildException, FlowImpossibleException;

    /** Metoda zatrzymuje proces i zwraca aktualnie wyliczony najlepszy layout. */
    public void setStopped()
    {
        stoppedFlag = true;
    }

    public static CostFunction getPreferableCostFunction() {
        return preferableCostFunction;
    }

}
